CSS View Transition APIã䜿çšããŠãSPAãšMPAã®äž¡æ¹ã§ã·ãŒã ã¬ã¹ãªã¢ããªã®ãããªããŒãžããã²ãŒã·ã§ã³ãäœæããããã®éçºè åãç·åã¬ã€ããã³ã¢ã³ã³ã»ãããšé«åºŠãªãã¯ããã¯ãåŠã³ãŸãã
CSS View Transition API: ã¹ã ãŒãºãªããŒãžããã²ãŒã·ã§ã³å®è£ ã®ããã®ç©¶æ¥µã¬ã€ã
äœå幎ãã®éãWebã®ããã²ãŒã·ã§ã³ã¯ãäžå¿«ãªçŸå®ïŒçã£çœãªç»é¢ãã«ãã£ãŠå®çŸ©ãããŠããŸããããªã³ã¯ãã¯ãªãã¯ããããšã¯ãå®å šãªããŒãžåèªã¿èŸŒã¿ãäžç¬ã®ç©ºçœã®ãã©ãã·ã¥ããããŠæ°ããã³ã³ãã³ãã®çªç¶ã®åºçŸãæå³ããŸãããæ©èœçã§ã¯ãããŸããããã®äœéšã«ã¯ãŠãŒã¶ãŒããã€ãã£ãã¢ããªã±ãŒã·ã§ã³ã«æåŸ ããããã«ãªã£ãæµåæ§ãæŽç·Žããæ¬ ããŠããŸããã·ã³ã°ã«ããŒãžã¢ããªã±ãŒã·ã§ã³ïŒSPAïŒã¯è§£æ±ºçãšããŠç»å Žããè€éãªJavaScriptãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠã·ãŒã ã¬ã¹ãªãã©ã³ãžã·ã§ã³ãäœæããŸããããå€ãã®å Žåãã¢ãŒããã¯ãã£ã®åçŽããåæèªã¿èŸŒã¿ããã©ãŒãã³ã¹ãç ç²ã«ããŠããŸããã
ãããäž¡æ¹ã®äžçã®è¯ããšããåããã§ãããã©ãã§ããããïŒãã«ãããŒãžã¢ããªã±ãŒã·ã§ã³ïŒMPAïŒã®ã·ã³ãã«ãªãµãŒããŒã¬ã³ããªã³ã°ã¢ãŒããã¯ãã£ãšãSPAã®ãšã¬ã¬ã³ãã§æå³ã®ãããã©ã³ãžã·ã§ã³ãçµã¿åãããããããCSS View Transition APIã®çŽæã§ãããç§ãã¡ãWebäžã®ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«ã€ããŠèããæ§ç¯ããæ¹æ³ã«é©åœãããããæºåãã§ããŠããç»æçãªãã©ãŠã¶æ©èœã§ãã
ãã®ç·åã¬ã€ãã§ã¯ãView Transition APIãæ·±ãæãäžããŠãããŸãããããäœã§ãããããªãWebéçºã«ãšã£ãŠèšå¿µç¢çãªå€åãªã®ãããããŠä»æ¥ãããã©ã®ããã«å®è£ ã§ãããâSPAãšãããã«ãšããµã€ãã£ã³ã°ãªããšã«ãåŸæ¥ã®MPAã®äž¡æ¹ã§âãæ¢æ±ããŸããçœããã©ãã·ã¥ã«å¥ããåããã·ãŒã ã¬ã¹ãªWebããã²ãŒã·ã§ã³ã®æ°æä»£ãžããããã
CSS View Transition APIãšã¯ïŒ
CSS View Transition APIã¯ãWebãã©ãããã©ãŒã ã«çŽæ¥çµã¿èŸŒãŸããã¡ã«ããºã ã§ãéçºè ãç°ãªãDOMïŒããã¥ã¡ã³ããªããžã§ã¯ãã¢ãã«ïŒã®ç¶æ éã«ã¢ãã¡ãŒã·ã§ã³ä»ãã®ãã©ã³ãžã·ã§ã³ãäœæã§ããããã«ãããã®ã§ãããã®æ žå¿ã¯ããã¥ãŒã®å€æŽãåãããŒãžå ïŒSPAã®å ŽåïŒã§èµ·ãããã2ã€ã®ç°ãªãããã¥ã¡ã³ãéïŒMPAã®å ŽåïŒã§èµ·ãããã«ãããããããããã¥ãŒããå¥ã®ãã¥ãŒãžã®èŠèŠçãªå€åã管çããç°¡åãªæ¹æ³ãæäŸããããšã§ãã
ãã®ããã»ã¹ã¯é©ãã»ã©å·§åŠã§ãããã©ã³ãžã·ã§ã³ãããªã¬ãŒããããšããã©ãŠã¶ã¯æ¬¡ã®ããšãè¡ããŸãïŒ
- çŸåšã®ããŒãžç¶æ ïŒå€ããã¥ãŒïŒã®ãã¹ã¯ãªãŒã³ã·ã§ããããæ®ããŸãã
- DOMãæ°ããç¶æ ã«æŽæ°ãããŸãã
- æ°ããããŒãžç¶æ ïŒæ°ãããã¥ãŒïŒã®ãã¹ã¯ãªãŒã³ã·ã§ããããæ®ããŸãã
- å€ããã¥ãŒã®ã¹ã¯ãªãŒã³ã·ã§ããããæ°ããã©ã€ããã¥ãŒã®äžã«é 眮ããŸãã
- 2ã€ã®éã®ãã©ã³ãžã·ã§ã³ãã¢ãã¡ãŒã·ã§ã³åããŸããéåžžã¯ããã©ã«ãã§ã¹ã ãŒãºãªã¯ãã¹ãã§ãŒããè¡ãããŸãã
ãã®ããã»ã¹å šäœã¯ãã©ãŠã¶ã«ãã£ãŠèª¿æŽããããããéåžžã«é«ãããã©ãŒãã³ã¹ãçºæ®ããŸããããã«éèŠãªã®ã¯ãéçºè ãæšæºçãªCSSã䜿çšããŠã¢ãã¡ãŒã·ã§ã³ãå®å šã«å¶åŸ¡ã§ããããšã§ããã€ãŠã¯è€éãªJavaScriptã®ã¿ã¹ã¯ã ã£ããã®ãã宣èšçã§ã¢ã¯ã»ã¹ããããã¹ã¿ã€ãªã³ã°ã®èª²é¡ã«å€ããã®ã§ãã
ãªããããWebéçºã®ã²ãŒã ãã§ã³ãžã£ãŒãªã®ã
ãã®APIã®å°å ¥ã¯ãåãªã挞é²çãªã¢ããããŒãã§ã¯ãããŸãããWebãã©ãããã©ãŒã ã«å¯Ÿããæ ¹æ¬çãªæ¹åã衚ããŠããŸãããããäžçäžã®éçºè ãšãŠãŒã¶ãŒã«ãšã£ãŠéåžžã«éèŠã§ããçç±ã¯æ¬¡ã®ãšããã§ãïŒ
- åçã«åäžãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ïŒUXïŒïŒã¹ã ãŒãºãªãã©ã³ãžã·ã§ã³ã¯åãªãè£ é£Ÿã§ã¯ãããŸããããããã¯èŠèŠçãªé£ç¶æ§ãæäŸãããŠãŒã¶ãŒãç°ãªããã¥ãŒéã®é¢ä¿ãçè§£ããã®ãå©ããŸãããµã ãã€ã«ãããã«ãµã€ãºã®ç»åãžãšã·ãŒã ã¬ã¹ã«æ¡å€§ããèŠçŽ ã¯ãã³ã³ããã¹ããæäŸãããŠãŒã¶ãŒã®æ³šæãèªå°ããã€ã³ã¿ãŒãã§ãŒã¹ãããçŽæçã§å¿çæ§ãé«ããã®ã«æããããŸãã
- å€§å¹ ã«ç°¡çŽ åãããéçºïŒãã®APIãç»å Žããåã¯ãåæ§ã®å¹æãå®çŸããã«ã¯ãéãJavaScriptã©ã€ãã©ãªïŒFramer MotionãGSAPãªã©ïŒãè€éãªCSS-in-JSãœãªã¥ãŒã·ã§ã³ãå¿ èŠã§ãããView Transition APIã¯ããã®è€éããåçŽãªé¢æ°åŒã³åºããšæ°è¡ã®CSSã§çœ®ãæããçŸããã¢ããªã®ãããªäœéšãäœæããããã®åå ¥éå£ãäžããŸãã
- åªããããã©ãŒãã³ã¹ïŒã¢ãã¡ãŒã·ã§ã³ããžãã¯ããã©ãŠã¶ã®ã¬ã³ããªã³ã°ãšã³ãžã³ã«ãªãããŒãããããšã§ããã¥ãŒãã©ã³ãžã·ã§ã³ã¯JavaScripté§åã®å¯Ÿå¿ç©ãããããã©ãŒãã³ã¹ãé«ããããããªãŒå¹çãè¯ããªããŸãããã©ãŠã¶ã¯ãæåã§åçŸããã®ãé£ããæ¹æ³ã§ããã»ã¹ãæé©åã§ããŸãã
- SPAãšMPAã®éã®æºãåããïŒããããæããšããµã€ãã£ã³ã°ãªåŽé¢ã¯ãã¯ãã¹ããã¥ã¡ã³ããã©ã³ãžã·ã§ã³ã®ãµããŒãã§ããããã«ãããåŸæ¥ã®ãµãŒããŒã¬ã³ããªã³ã°ããããŠã§ããµã€ãïŒMPAïŒããé·ããSPAå°çšãšèããããŠããæµåçãªããã²ãŒã·ã§ã³ãæ¡çšã§ããããã«ãªããŸããäŒæ¥ã¯ãã³ã¹ããšæéã®ãããSPAãã¬ãŒã ã¯ãŒã¯ãžã®å®å šãªã¢ãŒããã¯ãã£ç§»è¡ãè¡ãããšãªããæ¢åã®ãŠã§ããµã€ããææ°ã®UXãã¿ãŒã³ã§åŒ·åã§ããŸãã
ã³ã¢ã³ã³ã»ããïŒView Transitionã®èåŸã«ããéæ³ãçè§£ãã
APIããã¹ã¿ãŒããã«ã¯ããŸããã®2ã€ã®äž»èŠã³ã³ããŒãã³ããçè§£ããå¿ èŠããããŸãïŒJavaScriptã®ããªã¬ãŒãšãã«ã¹ã¿ãã€ãºãå¯èœã«ããCSSç䌌èŠçŽ ããªãŒã§ãã
JavaScriptã®ãšã³ããªãã€ã³ãïŒ`document.startViewTransition()`
ãã¹ãŠã¯åäžã®JavaScript颿°ããå§ãŸããŸãïŒ`document.startViewTransition()`ããã®é¢æ°ã¯åŒæ°ãšããŠã³ãŒã«ããã¯ãåãåããŸãããã®ã³ãŒã«ããã¯å ã§ãå€ãç¶æ ããæ°ããç¶æ ã«ç§»è¡ããããã«å¿ èŠãªãã¹ãŠã®DOMæäœãå®è¡ããŸãã
å žåçãªåŒã³åºãã¯æ¬¡ã®ããã«ãªããŸãïŒ
// ãŸãããã©ãŠã¶ãAPIããµããŒãããŠããã確èªãã
if (!document.startViewTransition) {
// ãµããŒããããŠããªãå Žåã¯ãçŽæ¥DOMãæŽæ°ãã
updateTheDOM();
} else {
// ãµããŒããããŠããå Žåã¯ãDOMã®æŽæ°ããã©ã³ãžã·ã§ã³é¢æ°ã§ã©ãããã
document.startViewTransition(() => {
updateTheDOM();
});
}
`startViewTransition`ãåŒã³åºããšããã©ãŠã¶ã¯åè¿°ã®ãã£ããã£-æŽæ°-ã¢ãã¡ãŒã·ã§ã³ã®ã·ãŒã±ã³ã¹ãéå§ããŸãããã®é¢æ°ã¯`ViewTransition`ãªããžã§ã¯ããè¿ããããã«ã¯ãã©ã³ãžã·ã§ã³ã®ã©ã€ããµã€ã¯ã«ã®ããŸããŸãªæ®µéã«ããã¯ããŠãããé«åºŠãªå¶åŸ¡ãè¡ãããã®ãããã¹ãå«ãŸããŠããŸãã
CSSç䌌èŠçŽ ããªãŒ
ã«ã¹ã¿ãã€ãºã®çã®åã¯ããã©ã³ãžã·ã§ã³äžã«ãã©ãŠã¶ãäœæããç¹å¥ãªCSSç䌌èŠçŽ ã®ã»ããã«ãããŸãããã®äžæçãªããªãŒã«ãããå€ããã¥ãŒãšæ°ãããã¥ãŒãåå¥ã«ã¹ã¿ã€ã«èšå®ã§ããŸãã
::view-transition: ããªãŒã®ã«ãŒãã§ããã¥ãŒããŒãå šäœãã«ããŒããŸãããã©ã³ãžã·ã§ã³ã®èæ¯è²ãç¶ç¶æéãèšå®ããããã«äœ¿çšã§ããŸãã::view-transition-group(name): åäžã®ãã©ã³ãžã·ã§ã³èŠçŽ ã衚ããŸããã¢ãã¡ãŒã·ã§ã³äžã®èŠçŽ ã®äœçœ®ãšãµã€ãºãæ åœããŸãã::view-transition-image-pair(name): èŠçŽ ã®å€ããã¥ãŒãšæ°ãããã¥ãŒã®ã³ã³ããã§ããåé¢ããã`mix-blend-mode`ãšããŠã¹ã¿ã€ã«èšå®ãããŸãã::view-transition-old(name): èŠçŽ ã®å€ãç¶æ ã®ã¹ã¯ãªãŒã³ã·ã§ããïŒäŸïŒãµã ãã€ã«ïŒã::view-transition-new(name): èŠçŽ ã®æ°ããç¶æ ã®ã©ã€ã衚çŸïŒäŸïŒãã«ãµã€ãºã®ç»åïŒã
ããã©ã«ãã§ã¯ããã®ããªãŒå ã®å¯äžã®èŠçŽ ã¯ããŒãžå šäœã衚ã`root`ã§ããç¹å®ã®èŠçŽ ãç¶æ éã§ã¢ãã¡ãŒã·ã§ã³ãããã«ã¯ããããã«äžè²«ãã`view-transition-name`ãäžããå¿ èŠããããŸãã
å®è·µçãªå®è£ ïŒåããŠã®View TransitionïŒSPAã®äŸïŒ
äžè¬çãªUIãã¿ãŒã³ãæ§ç¯ããŸãããïŒã¯ãªãã¯ãããšåãããŒãžã®è©³çްãã¥ãŒã«é·ç§»ããã«ãŒãã®ãªã¹ãã§ããéèŠãªã®ã¯ãç»åã®ãããªå ±æèŠçŽ ã2ã€ã®ç¶æ éã§ã¹ã ãŒãºã«å€åœ¢ããããšã§ãã
ã¹ããã1ïŒHTMLæ§é
ãªã¹ãçšã®ã³ã³ãããšè©³çްãã¥ãŒçšã®ã³ã³ãããå¿ èŠã§ãã芪èŠçŽ ã®ã¯ã©ã¹ãåãæ¿ããŠãäžæ¹ã衚瀺ããããäžæ¹ãé衚瀺ã«ããŸãã
<div id="app-container">
<div class="list-view">
<!-- ã«ãŒã 1 -->
<div class="card" data-id="item-1">
<img src="thumbnail-1.jpg" alt="Item 1">
<h3>åå1</h3>
</div>
<!-- ä»ã®ã«ãŒã... -->
</div>
<div class="detail-view" hidden>
<img src="large-1.jpg" alt="Item 1">
<h1>åå1</h1>
<p>詳现ãªèª¬æã¯ãã¡ã...</p>
<button id="back-button">æ»ã</button>
</div>
</div>
ã¹ããã2ïŒ`view-transition-name`ãå²ãåœãŠã
ãã©ãŠã¶ããµã ãã€ã«ç»åãšè©³çްãã¥ãŒã®ç»åã*åãæŠå¿µã®èŠçŽ *ã§ããããšãçè§£ããããã«ã¯ãCSSã§åã`view-transition-name`ãäžããå¿ èŠããããŸãããã®ååã¯ãããŒãžäžã®åãã©ã³ãžã·ã§ã³èŠçŽ ã«å¯ŸããŠåžžã«äžæã§ãªããã°ãªããŸããã
.card.active img {
view-transition-name: product-image;
}
.detail-view.active img {
view-transition-name: product-image;
}
JavaScriptã§è¿œå ãã`.active`ã¯ã©ã¹ã䜿çšããŠã衚瀺ãããŠããèŠçŽ ã«ã®ã¿ååãå²ãåœãŠãããç«¶åãé¿ããããã«ããŸãã
ã¹ããã3ïŒJavaScriptããžãã¯
次ã«ãDOMã®æŽæ°ãåŠçããããã`document.startViewTransition()`ã§ã©ãããã颿°ãäœæããŸãã
function showDetailView(itemId) {
const updateDOM = () => {
// æ£ããã«ãŒããšè©³çްãã¥ãŒã« 'active' ã¯ã©ã¹ã远å ãã
// ããã«ããCSSãä»ããŠview-transition-nameãå²ãåœãŠããã
document.querySelector(`.card[data-id='${itemId}']`).classList.add('active');
document.querySelector('.detail-view').classList.add('active');
// ãªã¹ããé衚瀺ã«ããŠè©³çްãã¥ãŒã衚瀺ãã
document.querySelector('.list-view').hidden = true;
document.querySelector('.detail-view').hidden = false;
};
if (!document.startViewTransition) {
updateDOM();
return;
}
document.startViewTransition(() => updateDOM());
}
ããã ãã§ãã«ãŒããã¯ãªãã¯ãããšãç»åã®ã¹ã ãŒãºãªã¢ãŒãã£ã³ã°ã¢ãã¡ãŒã·ã§ã³ãšãããŒãžã®æ®ãã®éšåã®ã¯ãã¹ãã§ãŒããããªã¬ãŒãããŸããè€éãªã¢ãã¡ãŒã·ã§ã³ã¿ã€ã ã©ã€ã³ãã©ã€ãã©ãªã¯å¿ èŠãããŸããã
次ã®ããã³ãã£ã¢ïŒMPAåãã®ã¯ãã¹ããã¥ã¡ã³ãView Transition
ããã§ããã®APIã¯çã«å€é©çãªãã®ã«ãªããŸãããããã®ã¹ã ãŒãºãªãã©ã³ãžã·ã§ã³ãåŸæ¥ã®ãã«ãããŒãžã¢ããªã±ãŒã·ã§ã³ïŒMPAïŒã«é©çšããããšã¯ã以åã¯SPAã«å€ããªããã°äžå¯èœã§ãããä»ã§ã¯ãç°¡åãªãªããã€ã³ã§å¯èœã§ãã
ã¯ãã¹ããã¥ã¡ã³ããã©ã³ãžã·ã§ã³ãæå¹ã«ãã
ç°ãªãããŒãžéã®ããã²ãŒã·ã§ã³ã§ãã©ã³ãžã·ã§ã³ãæå¹ã«ããã«ã¯ããœãŒã¹ããŒãžãšãã¹ãã£ããŒã·ã§ã³ããŒãžã®äž¡æ¹ã®CSSã«ç°¡åãªCSSã¢ããã«ãŒã«ã远å ããŸãïŒ
@view-transition {
navigation: auto;
}
ããã ãã§ãããã®ã«ãŒã«ãååšãããšããã©ãŠã¶ã¯ãã¹ãŠã®åäžãªãªãžã³ããã²ãŒã·ã§ã³ã«å¯ŸããŠèªåçã«ãã¥ãŒãã©ã³ãžã·ã§ã³ïŒããã©ã«ãã®ã¯ãã¹ãã§ãŒãïŒã䜿çšããŸãã
éµïŒäžè²«ãã`view-transition-name`
SPAã®äŸãšåæ§ã«ã2ã€ã®å¥ã ã®ããŒãžéã§èŠçŽ ãæ¥ç¶ããéæ³ã¯ãå ±æãããäžæã®`view-transition-name`ã«äŸåããŠããŸããååäžèЧããŒãžïŒ`/products`ïŒãšåå詳现ããŒãžïŒ`/products/item-1`ïŒãæ³åããŠã¿ãŸãããã
`products.html`äžïŒ
<a href="/products/item-1">
<img src="thumbnail-1.jpg" style="view-transition-name: product-image-1;">
</a>
`product-detail.html`äžïŒ
<div class="hero">
<img src="large-1.jpg" style="view-transition-name: product-image-1;">
</div>
ãŠãŒã¶ãŒãæåã®ããŒãžã®ãªã³ã¯ãã¯ãªãã¯ãããšããã©ãŠã¶ã¯`view-transition-name: product-image-1`ãæã€èŠçŽ ãããŒãžãé¢ããã®ã確èªããŸããæ¬¡ã«ãæ°ããããŒãžã®èªã¿èŸŒã¿ãåŸ ã¡ãŸãã2çªç®ã®ããŒãžãã¬ã³ããªã³ã°ããããšãåã`view-transition-name`ãæã€èŠçŽ ãèŠã€ããèªåçã«2ã€ã®éã§ã¹ã ãŒãºãªã¢ãŒãã£ã³ã°ã¢ãã¡ãŒã·ã§ã³ãäœæããŸããããŒãžã®æ®ãã®ã³ã³ãã³ãã¯ãããã©ã«ãã§åŸ®ããªã¯ãã¹ãã§ãŒãã«ãªããŸããããã«ããã以åã¯MPAã§ã¯èããããªãã£ãé床ãšé£ç¶æ§ã®æèŠãçãŸããŸãã
é«åºŠãªãã¯ããã¯ãšã«ã¹ã¿ãã€ãº
ããã©ã«ãã®ã¯ãã¹ãã§ãŒãã¯ãšã¬ã¬ã³ãã§ãããAPIã¯CSSã¢ãã¡ãŒã·ã§ã³ãéããŠæ·±ãã«ã¹ã¿ãã€ãºããã¯ãæäŸããŸãã
CSSã§ã¢ãã¡ãŒã·ã§ã³ãã«ã¹ã¿ãã€ãºãã
æšæºã®CSS `@keyframes`ãš`animation`ããããã£ã§ç䌌èŠçŽ ãã¿ãŒã²ããã«ããããšã§ãããã©ã«ãã®ã¢ãã¡ãŒã·ã§ã³ãäžæžãã§ããŸãã
äŸãã°ãæ°ããããŒãžã³ã³ãã³ãã«ãå³ããã¹ã©ã€ãã€ã³ããã广ãäœæããã«ã¯ïŒ
@keyframes slide-from-right {
from { transform: translateX(100%); }
}
::view-transition-new(root) {
animation: slide-from-right 0.5s ease-out;
}
ç°ãªãèŠçŽ ã«å¯ŸããŠ`::view-transition-old`ãš`::view-transition-new`ã«å¥ã ã®ã¢ãã¡ãŒã·ã§ã³ãé©çšããŠãé«åºŠã«æ¯ãä»ããããæŽç·Žããããã©ã³ãžã·ã§ã³ãäœæã§ããŸãã
ã¯ã©ã¹ã§ãã©ã³ãžã·ã§ã³ã®çš®é¡ãå¶åŸ¡ãã
äžè¬çãªèŠä»¶ã¯ãé²ãããã²ãŒã·ã§ã³ãšæ»ãããã²ãŒã·ã§ã³ã§ç°ãªãã¢ãã¡ãŒã·ã§ã³ã䜿çšããããšã§ããããšãã°ãé²ãããã²ãŒã·ã§ã³ã§ã¯æ°ããããŒãžãå³ããã¹ã©ã€ãã€ã³ããæ»ãããã²ãŒã·ã§ã³ã§ã¯å·Šããã¹ã©ã€ãã€ã³ããããã«ããŸããããã¯ããã©ã³ãžã·ã§ã³ãããªã¬ãŒããçŽåã«ããã¥ã¡ã³ãèŠçŽ ïŒ``ïŒã«ã¯ã©ã¹ã远å ããããšã§å®çŸã§ããŸãã
ãæ»ãããã¿ã³ã®JavaScriptïŒ
backButton.addEventListener('click', (event) => {
event.preventDefault();
document.documentElement.classList.add('is-going-back');
document.startViewTransition(() => {
// æ»ãããã®ããžãã¯
Promise.resolve().then(() => {
document.documentElement.classList.remove('is-going-back');
});
});
});
ç°ãªãã¢ãã¡ãŒã·ã§ã³ãå®çŸ©ããCSSïŒ
/* ããã©ã«ãã®é²ãã¢ãã¡ãŒã·ã§ã³ */
::view-transition-new(root) {
animation: slide-from-right 0.5s;
}
/* æ»ãã¢ãã¡ãŒã·ã§ã³ */
.is-going-back::view-transition-new(root) {
animation: slide-from-left 0.5s;
}
ãã®åŒ·åãªãã¿ãŒã³ã¯ããŠãŒã¶ãŒã®ããã²ãŒã·ã§ã³äœéšããã现ããå¶åŸ¡ããŸãã
ã¢ã¯ã»ã·ããªãã£ã«é¢ããèæ ®äºé
ææ°ã®Web APIã¯ã匷åãªã¢ã¯ã»ã·ããªãã£ãçµã¿èŸŒãŸããŠããªããã°äžå®å šã§ãããView Transition APIã¯ãããæäŸããŸãã
- ãŠãŒã¶ãŒèšå®ã®å°éïŒAPIã¯èªåçã«`prefers-reduced-motion`ã¡ãã£ã¢ã¯ãšãªãå°éããŸãããŠãŒã¶ãŒããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®èšå®ã§åããå°ãªãããããšãåžæããŠããå Žåããã©ã³ãžã·ã§ã³ã¯ã¹ããããããDOMã®æŽæ°ã¯å³åº§ã«è¡ãããŸããããã¯éçºè ããã®è¿œå äœæ¥ãªãã«ããã©ã«ãã§çºçããŸãã
- ãã©ãŒã«ã¹ã®ç¶æïŒãã©ã³ãžã·ã§ã³ã¯çŽç²ã«èŠèŠçãªãã®ã§ããæšæºã®ãã©ãŒã«ã¹ç®¡çã劚ããããšã¯ãããŸããããã©ã³ãžã·ã§ã³åŸãããŒããŒããã©ãŒã«ã¹ãæ°ãããã¥ãŒã®è«ççãªèŠçŽ ïŒã¡ã€ã³ã®èŠåºããæåã®ã€ã³ã¿ã©ã¯ãã£ããªèŠçŽ ãªã©ïŒã«ç§»åããããšãä¿èšŒããã®ã¯ãäŸç¶ãšããŠéçºè ã®è²¬ä»»ã§ãã
- ã»ãã³ãã£ãã¯HTMLïŒAPIã¯æ¡åŒµã¬ã€ã€ãŒã§ããåºç€ãšãªãHTMLã¯ã»ãã³ãã£ãã¯ã§ã¢ã¯ã»ã¹å¯èœã§ããã¹ãã§ããã¹ã¯ãªãŒã³ãªãŒããŒã䜿çšããŠãããŠãŒã¶ãŒãããµããŒãããŠããªããã©ãŠã¶ã®ãŠãŒã¶ãŒã¯ããã©ã³ãžã·ã§ã³ãªãã§ã³ã³ãã³ããäœéšãããããæ§é èªäœãæå³ããªãå¿ èŠããããŸãã
ãã©ãŠã¶ãµããŒããšããã°ã¬ãã·ããšã³ãã³ã¹ã¡ã³ã
2023幎åŸåã®æç¹ã§ãSPAåãã®View Transition APIã¯ChromiumããŒã¹ã®ãã©ãŠã¶ïŒChromeãEdgeãOperaïŒã§ãµããŒããããŠããŸããMPAåãã®ã¯ãã¹ããã¥ã¡ã³ããã©ã³ãžã·ã§ã³ã¯æ©èœãã©ã°ã®èåŸã§å©çšå¯èœã§ãããæŽ»çºã«éçºãé²ããããŠããŸãã
ãã®APIã¯ãåœåããããã°ã¬ãã·ããšã³ãã³ã¹ã¡ã³ãã®ããã«èšèšãããŠããŸããå ã»ã©äœ¿çšããã¬ãŒããã¿ãŒã³ããã®éµã§ãïŒ
if (!document.startViewTransition) { ... }
ãã®ç°¡åãªãã§ãã¯ã«ãããã³ãŒãã¯ããããµããŒããããã©ãŠã¶ã§ã®ã¿ãã©ã³ãžã·ã§ã³ãäœæããããšããŸããå€ããã©ãŠã¶ã§ã¯ãDOMã®æŽæ°ã¯ãããŸã§ã©ããå³åº§ã«è¡ãããŸããããã¯ãææ°ã®ãã©ãŠã¶ã䜿çšããŠãããŠãŒã¶ãŒã®äœéšãåäžãããããã«ä»æ¥ããAPIã䜿ãå§ããããšãã§ããå€ããã©ãŠã¶ã䜿çšããŠãããŠãŒã¶ãŒã«ã¯äœãæªåœ±é¿ãäžããªãããšãæå³ããŸããããã¯ãŠã£ã³ãŠã£ã³ã®ã·ããªãªã§ãã
Webããã²ãŒã·ã§ã³ã®æªæ¥
View Transition APIã¯ãåãªãç®ãåŒãã¢ãã¡ãŒã·ã§ã³ã®ããã®ããŒã«ã§ã¯ãããŸãããããã¯ãéçºè ãããçŽæçã§ãäžè²«æ§ããããé åçãªãŠãŒã¶ãŒãžã£ãŒããŒãäœãäžããããšãå¯èœã«ããæ ¹æ¬çãªå€åã§ããããŒãžãã©ã³ãžã·ã§ã³ãæšæºåããããšã§ãWebãã©ãããã©ãŒã ã¯ãã€ãã£ãã¢ããªã±ãŒã·ã§ã³ãšã®ã®ã£ãããåããããããã¿ã€ãã®ãŠã§ããµã€ãã«æ°ããã¬ãã«ã®åè³ªãšæŽç·ŽãããããããŸãã
ãã©ãŠã¶ã®ãµããŒããæ¡å€§ããã«ã€ããŠãããŒãžéã®ç§»åãããŒãžèªäœãšåããããèãæãããŠèšèšããããWebãã¶ã€ã³ã«ãããæ°ããåµé æ§ã®æ³¢ãèŠããããšæåŸ ã§ããŸããSPAãšMPAã®å¢çç·ã¯ææ§ã«ãªãç¶ããããŒã ã¯ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãç ç²ã«ããããšãªãããããžã§ã¯ãã«æé©ãªã¢ãŒããã¯ãã£ãéžæã§ããããã«ãªãã§ãããã
çµè«ïŒä»æ¥ããããã¹ã ãŒãºãªäœéšã®æ§ç¯ãå§ããã
CSS View Transition APIã¯ã匷åãªæ©èœãšé©ãã¹ãã·ã³ãã«ãã®çšãªçµã¿åãããæäŸããŸãããµã€ãã®ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæ©èœçãªãã®ããæ¥œãããã®ãžãšåŒãäžããããã®ãããã©ãŒãã³ã¹ãé«ããã¢ã¯ã»ã¹å¯èœã§ãããã°ã¬ãã·ãã«åŒ·åãããæ¹æ³ãæäŸããŸãã
è€éãªSPAãæ§ç¯ããŠããå Žåã§ããåŸæ¥ã®ãµãŒããŒã¬ã³ããªã³ã°ã®ãŠã§ããµã€ããæ§ç¯ããŠããå Žåã§ããäžå¿«ãªããŒãžèªã¿èŸŒã¿ããªãããæµåçã§æå³ã®ããã¢ãã¡ãŒã·ã§ã³ã§ãŠãŒã¶ãŒãã€ã³ã¿ãŒãã§ãŒã¹ãéããŠå°ãããã®ããŒã«ãå©çšå¯èœã«ãªããŸããããã®åãçè§£ããæè¯ã®æ¹æ³ã¯ã詊ããŠã¿ãããšã§ããã¢ããªã±ãŒã·ã§ã³ã®å°ããªéšåâã®ã£ã©ãªãŒãèšå®ããŒãžããŸãã¯è£œåãããŒâãåãäžããŠå®éšããŠã¿ãŠãã ãããæ°è¡ã®ã³ãŒãããŠã§ããµã€ãã®æè§Šãæ ¹æ¬çã«å€ããããšã«é©ãã§ãããã
çœããã©ãã·ã¥ã®æä»£ã¯çµãããåããŠããŸããWebããã²ãŒã·ã§ã³ã®æªæ¥ã¯ã·ãŒã ã¬ã¹ã§ãããView Transition APIã䜿ãã°ã仿¥ãããããæ§ç¯ããããã«å¿ èŠãªãã®ããã¹ãŠæã£ãŠããŸãã